package fun.werfamily.wf.user.core.domain.aspect;//package fun.werfamily.user.domain.aspect;
//
//import com.alibaba.fastjson.JSON;
//import fun.werfamily.user.domain.annotation.MustLogin;
//import fun.werfamily.user.domain.dto.resp.Response;
//import fun.werfamily.user.domain.dto.resp.TokenInfoDTO;
//import fun.werfamily.user.domain.exception.UserCoreException;
//import fun.werfamily.user.domain.util.RedisUtil;
//import fun.werfamily.user.domain.util.TokenUtil;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.After;
//import org.aspectj.lang.annotation.AfterReturning;
//import org.aspectj.lang.annotation.AfterThrowing;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Before;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.annotation.Resource;
//import javax.servlet.http.HttpServletRequest;
//import java.io.IOException;
//import java.lang.reflect.Method;
//
///**
// * @Author: Mr.WenMing Zhang
// * @Date: 2022/07/29 17:41
// * @Description:
// **/
//@Aspect
//@Slf4j
//@Component
//public class AuthAspect {
//
//    @Resource
//    private RedisUtil redisUtil;
//
//    /**
//     * 指定切入点
//     */
//    @Pointcut("execution(public * fun.werfamily.user.api.controller..*.*(..))")
//    public void cutMethod() {
//    }
//
//    /**
//     * 前置通知：在目标方法执行前调用
//     */
//    @Before("cutMethod()")
//    public void before(JoinPoint joinPoint) throws IOException {
//    }
//
//    /**
//     * 环绕通知：在目标方法执行前后 增强
//     *
//     * @param proceedingJoinPoint
//     * @return
//     * @throws Throwable
//     */
//    @Around("cutMethod()")
//    public Response around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//        log.info("-----进入权限限制切面-----");
//        ServletRequestAttributes servletContainer = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        Long userId = null;
//        if (null == servletContainer) {
//            // 退出切面
//            log.info("-----servletContainer为空，退出切面-----");
//            return (Response) proceedingJoinPoint.proceed();
//        }
//        HttpServletRequest request = servletContainer.getRequest();
//        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
//        Method method = signature.getMethod();
//        MustLogin mustLogin = method.getAnnotation(MustLogin.class);
//        if (null != mustLogin && !mustLogin.value()) {
//            log.info("-----校验登录，切面-----");
//            return (Response) proceedingJoinPoint.proceed();
//        }
//        try {
//            // 获取请求用户id
//            TokenInfoDTO tokenInfoDTO = TokenUtil.parseToken(request);
//            log.info("tokenInfoDTO{}", JSON.toJSON(tokenInfoDTO));
//        } catch (UserCoreException userCoreException) {
//            log.warn("-----得到token中的用户id， 异常-----");
//            throw userCoreException;
//        }
//        return (Response) proceedingJoinPoint.proceed();
//    }
//
//    /**
//     * 后置通知：在目标方法执行后调用，若目标方法出现异常，则不执行
//     */
//    @AfterReturning("cutMethod()")
//    public void afterReturning() {
//    }
//
//    /**
//     * 后置/最终通知：无论目标方法在执行过程中出现一场都会在它之后调用
//     */
//    @After("cutMethod()")
//    public void after() {
//    }
//
//    /**
//     * 异常通知：目标方法抛出异常时执行
//     */
//    @AfterThrowing("cutMethod()")
//    public void afterThrowing() {
//    }
//}
